﻿using System;
using System.ComponentModel;
using System.Linq;
using System.Windows.Forms;
using GSQ.BusinessEntities;
using GSQ.BusinessLogic;
using GSQ.Rpt_s;



namespace UIapp.Dialogos
{
    public partial class frmCompras : Plantillas.frmDialogPlantilla, Interfaces.IPantalla
    {
        public frmCompras(COMPRAS entity)
        {
            InitializeComponent();
            if (entity == null)
            {
                this.newEntity = new COMPRAS();
                this.oldEntity = null;
            }
            else
            {
                this.oldEntity = entity;
                this.newEntity = new ComprasBL().GetById(entity.ID);
            }

            this.cmbCondicion.DisplayMember = "CONDICION";
            this.cmbCondicion.ValueMember = "ID";
            this.cmbCondicion.DataSource = new CondicionesBL().GetAll();

            if (Comun.usuario != null)
            {
                this.newEntity.ID_USUARIO = Comun.usuario.ID;
                this.newEntity.USUARIOS = Comun.usuario;
            }
            this.ctrAgregarProductos1.EditCosto = true;
            this.ctrAgregarProductos1.EditDescuento = true;
            this.ctrAgregarProductos1.AllowCantidadCero = false;
            this.ctrAgregarProductos1.COSTO_PRECIO = Controles.ctrAgregarProductos.CostoPrecio.Costo;
            this.BindControls();
        }

        #region Variables
        public COMPRAS newEntity;
        public COMPRAS oldEntity;
        public SUPLIDORES suplidor;
        bool entityError = false;
        #endregion

        #region Implementacion IPantalla
        public int ComandosSoportados
        {
            get { return 0; }
        }

        public void Nuevo()
        {
            throw new NotImplementedException();
        }

        public void Modificar()
        {
            throw new NotImplementedException();
        }

        public void Eliminar()
        {
            throw new NotImplementedException();
        }

        public void Refrescar()
        {
            throw new NotImplementedException();
        }

        public void Buscar()
        {
            throw new NotImplementedException();
        }

        public void AgregarProducto(Controles.TransferEntity tranferEntity)
        {
            foreach (COMPRAS_DETALLES t in this.newEntity.COMPRAS_DETALLES)
            {
                if (t.ID_PRODUCTO == tranferEntity.PRODUCTOS.ID)
                {
                    Comun.ShowInMainMessage("Producto " + tranferEntity.PRODUCTOS.CODIGO + " previamente agregado.");
                    return;
                }
            }
            COMPRAS_DETALLES compraInvDetalle = new COMPRAS_DETALLES();

            compraInvDetalle.ID = 0;
            compraInvDetalle.ID_PRODUCTO = tranferEntity.PRODUCTOS.ID;
            compraInvDetalle.CANTIDAD = tranferEntity.CANTIDAD;
            compraInvDetalle.COSTO = tranferEntity.COSTO;
            compraInvDetalle.COSTO_ANTERIOR = tranferEntity.PRODUCTOS.COSTO;
            if (Comun.utilidades.AJUSTAR_PRECIOS_COSTO_COMPRAS)
                compraInvDetalle.PRECIO = tranferEntity.COSTO + ((tranferEntity.COSTO * tranferEntity.PRODUCTOS.X_GANANCIA) / 100);
            compraInvDetalle.PRECIO_ANTERIOR = tranferEntity.PRODUCTOS.PRECIO;
            compraInvDetalle.DESCUENTO = tranferEntity.DESCUENTO;
            compraInvDetalle.X_DESCUENTO = (compraInvDetalle.DESCUENTO / (compraInvDetalle.CANTIDAD * compraInvDetalle.COSTO)) * 100;
            if (tranferEntity.PRODUCTOS.IMPUESTOS)
            {
                compraInvDetalle.IMPUESTO = ((compraInvDetalle.CANTIDAD * compraInvDetalle.COSTO) - compraInvDetalle.DESCUENTO) * (Comun.utilidades.X_IMPUESTOS / 100);
                compraInvDetalle.X_IMPUESTO = Comun.utilidades.X_IMPUESTOS;
            }
            compraInvDetalle.C_DEVUELTA = 0;
            compraInvDetalle.DESCRIPCIONES = tranferEntity.PRODUCTOS.DESCRIPCIONES;
            compraInvDetalle.MEDIDAS = tranferEntity.PRODUCTOS.MEDIDAS;
            compraInvDetalle.PRODUCTOS = tranferEntity.PRODUCTOS;
            if (compraInvDetalle.IsValid())
            {
                this.newEntity.COMPRAS_DETALLES.Add(compraInvDetalle);
                this.bindingSource.DataSource = this.newEntity.COMPRAS_DETALLES.ToList();
                this.CalcularTotales();
            }
            else
                Comun.ShowMessage(compraInvDetalle);
        }
        #endregion

        #region Tratamiento de eventos

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("¿Está seguro que desea guardar los datos?\r\rDurante este proceso si su empresa esta configurada para ajustar precios y costos en el registro de compras los productos incluidos serán actualizados."
                    , "Confirmación", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)
                    == System.Windows.Forms.DialogResult.OK)
                {
                    if (this.newEntity.COMPRAS_DETALLES.Count == 0)
                    {
                        Comun.ShowInMainMessage("Debe agregar por lo menos un item a la lista.");
                        return;
                    }
                    this.backgroundWorker.RunWorkerAsync();
                    Comun.ShowLoadingFRM();
                }
            }
            catch (Exception ex)
            {
                Comun.ShowMessage(ex);
            }
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            this.Guardar();
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Comun.CloseLoadingFRM();
            if (e.Error != null)
                Comun.ShowMessage(e.Error);
            else if (this.entityError)
                return;
            else
            {
                Comun.ShowInMainMessage("Datos guardados correctamente.");
                this.DialogResult = System.Windows.Forms.DialogResult.OK;
                Plantillas.frmReportPreview frm = new Plantillas.frmReportPreview();
                frm.crystalReportViewer1.ReportSource = new Reportes().GetCompra(newEntity.ID);
                frm.MdiParent = this.MdiParent;
                frm.Show();
                this.Close();
            }
        }

        private void radGridView_UserDeletingRow(object sender, Telerik.WinControls.UI.GridViewRowCancelEventArgs e)
        {
            this.newEntity.COMPRAS_DETALLES.Remove((COMPRAS_DETALLES)this.radGridView.CurrentRow.DataBoundItem);
            this.CalcularTotales();
        }

        private void cmbCondicion_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
        {
            if (this.cmbCondicion.SelectedItem != null)
                this.newEntity.ID_CONDICION = (decimal)this.cmbCondicion.SelectedItem.Value;
        }

        private void txtIdSuplidor_Validating(object sender, CancelEventArgs e)
        {
            decimal id = 0;
            if (this.txtIdSuplidor.Text.Trim() != string.Empty)
            {
                if (decimal.TryParse(this.txtIdSuplidor.Text.Trim(), out id))
                {
                    if (this.suplidor == null || this.suplidor.ID != id)
                    {
                        BuscarSuplidor(id);
                    }
                }
                else
                {
                    Comun.ShowInMainMessage("Solo se permiten números en este campo.");
                    this.txtIdSuplidor.Focus();
                    this.txtIdSuplidor.SelectAll();
                    this.LimpiarSuplidorGroup();
                    this.suplidor = null;
                }
            }
            else
            {
                this.LimpiarSuplidorGroup();
                this.suplidor = null;
            }
        }

        private void fechaDateTimePicker_ValueChanged(object sender, EventArgs e)
        {
            if (this.suplidor != null)
            {
                this.fVencimientoDateTimePicker.Value = this.fechaDateTimePicker.Value.AddDays(Convert.ToDouble(suplidor.PLAZO_PAGO));
            }
        }

        private void txtNcf_Validating(object sender, CancelEventArgs e)
        {
            if (this.txtNcf.Value != null && this.txtNcf.Value.ToString() != string.Empty)
            {
                if (this.txtNcf.Value.ToString().Length < 19)
                {
                    this.txtNcf.Focus();
                    Comun.ShowInMainMessage("Este NCF esta incompleto");
                }
            }
        }

        private void txtIdSuplidor_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F9)
            {
                e.Handled = true;
                Vistas.frmSuplidores frm = new Vistas.frmSuplidores(true);
                frm.ShowDialog();
                if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
                {
                    suplidor = (SUPLIDORES)frm.radGridView.CurrentRow.DataBoundItem;
                    if (this.suplidor != null)
                    {
                        if (suplidor.ACTIVO)
                        {
                            this.newEntity.ID_SUPLIDOR = suplidor.ID;
                            this.newEntity.SUPLIDORES = suplidor;
                            this.LimpiarSuplidorGroup();
                            this.txtIdSuplidor.Text = suplidor.ID.ToString("00000");
                            this.lblSuplidor.Text = this.suplidor.SUPLIDOR;
                            this.lblDireccionSuplidor.Text = this.suplidor.DIRECCION;
                            this.lblCiudadSuplidor.Text = suplidor.CIUDADES.CIUDAD;
                            this.lblTelefonoSuplidor.Text = suplidor.TELEFONO1;
                            this.lblRncSuplidor.Text = suplidor.RNC;
                            this.fVencimientoDateTimePicker.Value = this.fechaDateTimePicker.Value.AddDays(Convert.ToDouble(suplidor.PLAZO_PAGO));
                        }
                        else
                        {
                            Comun.ShowInMainMessage("Suplidor está inactico. VERIFIQUE.");
                            this.LimpiarSuplidorGroup();
                            suplidor = null;
                            this.txtIdSuplidor.Focus();
                        }
                    }
                }
            }
        }
        #endregion

        #region Metodos auxiliares
        public void BindControls()
        {
            this.fechaDateTimePicker.Value = this.newEntity.FECHA;
            this.fVencimientoDateTimePicker.Value = this.newEntity.F_VENCIMIENTO;
            if (this.newEntity.NCF != string.Empty)
                this.txtNcf.Text = this.newEntity.NCF;
            this.txtNroDocumento.Text = this.newEntity.NRO_FACTURA;
            this.cmbCondicion.SelectedValue = this.newEntity.ID_CONDICION;
            if (this.newEntity.SUPLIDORES != null)
            {
                this.LimpiarSuplidorGroup();
                this.newEntity.SUPLIDORES = new SuplidoresBL().GetById(newEntity.ID_SUPLIDOR);
                this.txtIdSuplidor.Text = newEntity.SUPLIDORES.ID.ToString("00000");
                this.lblSuplidor.Text = this.newEntity.SUPLIDORES.SUPLIDOR;
                this.lblDireccionSuplidor.Text = this.newEntity.SUPLIDORES.DIRECCION;
                this.lblCiudadSuplidor.Text = this.newEntity.SUPLIDORES.CIUDADES.CIUDAD;
                this.lblTelefonoSuplidor.Text = this.newEntity.SUPLIDORES.TELEFONO1;
                this.lblRncSuplidor.Text = this.newEntity.SUPLIDORES.RNC;
            }
            this.bindingSource.DataSource = this.newEntity.COMPRAS_DETALLES.ToList();
            this.CalcularTotales();
        }

        private void Guardar()
        {

            this.newEntity.FECHA = this.fechaDateTimePicker.Value;
            this.newEntity.F_VENCIMIENTO = this.fVencimientoDateTimePicker.Value;
            if (this.txtNcf.Value != null && this.txtNcf.Value.ToString() != string.Empty)
                this.newEntity.NCF = this.txtNcf.Value.ToString();
            this.newEntity.NRO_FACTURA = this.txtNroDocumento.Text;
            this.newEntity.ID_CONDICION = (decimal)this.cmbCondicion.SelectedValue;
            this.newEntity.OBSERVACIONES = this.txtObservaciones.Text.Trim();
            this.newEntity.ACTIVO = true;
            this.newEntity.T_DESCUENTO = decimal.Parse(lblTotalDescuento.Text);
            this.newEntity.T_IMPUESTO = decimal.Parse(lblTotalImpuestos.Text);
            this.newEntity.M_TOTAL = decimal.Parse(lblTotalGeneral.Text);
            if (newEntity.IsValid())
            {
                if (this.oldEntity == null)
                {
                    new ComprasBL().Insert(this.newEntity);
                }
                else
                {
                    new ComprasBL().Update(this.newEntity, this.oldEntity);
                    this.oldEntity = this.newEntity;
                }
                this.entityError = false;
            }
            else
            {
                this.entityError = true;
                Comun.ShowMessage(newEntity);
            }
        }

        public void BuscarSuplidor(decimal id)
        {
            this.suplidor = new SuplidoresBL().GetById(id);

            if (this.suplidor != null)
            {
                if (suplidor.ACTIVO)
                {
                    this.newEntity.ID_SUPLIDOR = suplidor.ID;
                    this.newEntity.SUPLIDORES = suplidor;
                    this.LimpiarSuplidorGroup();
                    this.txtIdSuplidor.Text = suplidor.ID.ToString("00000");
                    this.lblSuplidor.Text = this.suplidor.SUPLIDOR;
                    this.lblDireccionSuplidor.Text = this.suplidor.DIRECCION;
                    this.lblCiudadSuplidor.Text = suplidor.CIUDADES.CIUDAD;
                    this.lblTelefonoSuplidor.Text = suplidor.TELEFONO1;
                    this.lblRncSuplidor.Text = suplidor.RNC;
                    this.fVencimientoDateTimePicker.Value = this.fechaDateTimePicker.Value.AddDays(Convert.ToDouble(suplidor.PLAZO_PAGO));
                }
                else
                {
                    Comun.ShowInMainMessage("Suplidor está inactico. VERIFIQUE.");
                    this.LimpiarSuplidorGroup();
                    suplidor = null;
                    this.txtIdSuplidor.Focus();
                }
            }
            else
            {
                Comun.ShowInMainMessage("No existe suplidor con este codigo. VERIFIQUE.");
                this.txtIdSuplidor.SelectAll();
                suplidor = null;
                this.txtIdSuplidor.Focus();
            }
        }

        private void CalcularTotales()
        {
            if (this.newEntity.COMPRAS_DETALLES.Count > 0)
            {
                decimal Tdescuento = 0, Timpuesto = 0, Stotal = 0, T = 0;
                foreach (COMPRAS_DETALLES f in this.newEntity.COMPRAS_DETALLES)
                {
                    Tdescuento = Tdescuento + f.DESCUENTO;
                    Timpuesto = Timpuesto + f.IMPUESTO;
                    Stotal = Stotal + f.SUB_TOTAL_X_COSTO;
                    T = (Stotal - Tdescuento) + Timpuesto;

                }
                this.lblTotalDescuento.Text = Tdescuento.ToString("N2");
                this.lblTotalImpuestos.Text = Timpuesto.ToString("N2");
                this.lblSubTotal.Text = Stotal.ToString("N2");
                this.lblTotalGeneral.Text = T.ToString("N2");
            }
            else
            {
                this.lblTotalImpuestos.Text = "0.00";
                this.lblTotalDescuento.Text = "0.00";
                this.lblSubTotal.Text = "0.00";
                this.lblTotalGeneral.Text = "0.00";
            }
        }

        private void LimpiarSuplidorGroup()
        {
            foreach (Control c in this.radGroupBox1.Controls)
            {
                if (c is Label)
                {
                    ((Label)c).Text = "";
                }
            }
        }
        #endregion
    }
}
